package br.com.ifba.sadd.componentes
{
	import mx.validators.ValidationResult;
	import mx.validators.Validator;

	public class CPFValidador extends Validator
	{
		
		public function CPFValidador()
		{
			super();
		}
		
		override protected function doValidation(value:Object):Array
		{
			var cpfInvalido:ValidationResult = new ValidationResult(true, null, "Erro","CPF inválido!")
			var results:Array = super.doValidation(value.text);	
			var digito:Array = new Array(); // array para os dígitos do CPF.	
			var aux:Number= 0;
			var posicao:Number;
			var i:Number;
			var soma:Number;
			var dv:Number;
			var dvInformado:Number;
			var CPF:String = value.text;
			// Retira os dígitos formatadores de CPF '.' e '-', caso existam.	
			CPF.replace(".", "");	
			CPF.replace("-", "");
			switch(CPF)
			{
				case "0":
				{
					results.push(cpfInvalido);	
					return results;
				}
				case "00":
				{
					results.push(cpfInvalido);	
					return results;
				}
				case "000":
				{
					results.push(cpfInvalido);	
					return results;
				}
				case "0000":
				{
					results.push(cpfInvalido);	
					return results;
				}
				case "00000":
				{
					results.push(cpfInvalido);	
					return results;
				}
				case "000000":
				{
					results.push(cpfInvalido);	
					return results;
				}
				case "0000000":
				{
					results.push(cpfInvalido);	
					return results;
				}
				case "00000000":
				{
					results.push(cpfInvalido);	
					return results;
				}
				case "000000000":
				{
					results.push(cpfInvalido);	
					return results;
				}
				case "0000000000":
				{
					results.push(cpfInvalido);	
					return results;
				}
				case "00000000000":
				{
					results.push(cpfInvalido);	
					return results;
				}
				case "11111111111":
				{
					results.push(cpfInvalido);	
					return results;
				}
				case "22222222222":
				{
					results.push(cpfInvalido);
					return results;
				}
				case "33333333333":
				{
					results.push(cpfInvalido);	
					return results;
				}
				case "44444444444":
				{
					results.push(cpfInvalido);	
					return results;
				}
				case "55555555555":
				{
					results.push(cpfInvalido);	
					return results;
				}
				case "66666666666":
				{
					results.push(cpfInvalido);	
					return results;
				}
				case "77777777777":
				{
					results.push(cpfInvalido);	
					return results;
				}
				case "88888888888":
				{
					results.push(cpfInvalido);	
					return results;
				}
				case "99999999999":
				{
					results.push(cpfInvalido);	
					return results;
				}
				default:
				{
					// Início da validação do CPF.	
					/* Retira do número informado os dois últimos dígitos */	
					dvInformado = parseInt(CPF.substr(9,2));	
					/* Desmembra o número do CPF no array digito */
					
					for (i=0; i<= 8; i++)	
					{	
						digito[i] = CPF.substr(i,1);	
					}
					
					/* Calcula o valor do 10o. digito de verificação */	
					posicao = 10;	
					soma = 0;	
					for (i=0; i  <= 8; i++)	
					{	
						soma = soma + digito[i] * posicao;	
						posicao--;	
					}
					
					digito[9] = soma % 11;
					
					if (digito[9] < 2)	
					{
						digito[9] = 0;	
					}	
					else	
					{	
						digito[9] = 11 - digito[9];	
					}
					
					/* Calcula o valor do 11o. digito de verificação */		
					posicao = 11;
					
					soma = 0;
					
					for (i=0; i <= 9; i++)	
					{	
						soma = soma + digito[i] * posicao;	
						posicao--;	
					}	
					digito[10] = soma % 11;	
					if (digito[10] < 2)	
					{	
						digito[10] = 0;	
					}	
					else	
					{	
						digito[10] = 11 - digito[10];
					}	
					dv = digito[9] * 10 + digito[10];
					
					/* Verifica se o DV calculado é igual ao informado */
					if(dv != dvInformado)
					{
						results.push(cpfInvalido);
					}
					return results;
				}
			}
		}
		
		override protected function getValueFromSource():Object
		{
			var value:Object = {};
			value.text = super.getValueFromSource();
			return  value;
		} 
	}
}